#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AIOT智能学习桌项目 - 简单语音识别演示
专门用于展示语音转文字功能
支持实时语音识别和文字输出
"""

import speech_recognition as sr
import time
from datetime import datetime
import threading

class SimpleVoiceDemo:
    """简单语音识别演示类"""
    
    def __init__(self):
        """初始化语音识别演示"""
        print("🎯 初始化简单语音识别演示...")
        
        # 初始化识别器和麦克风
        self.recognizer = sr.Recognizer()
        self.microphone = sr.Microphone()
        
        # 控制标志
        self.is_running = False
        
        # 统计信息
        self.recognition_count = 0
        self.success_count = 0
        
        # 调整麦克风
        self._setup_microphone()
        
        print("✅ 语音识别演示初始化完成")
    
    def _setup_microphone(self):
        """设置麦克风"""
        try:
            print("🔧 正在调整麦克风设置...")
            with self.microphone as source:
                self.recognizer.adjust_for_ambient_noise(source, duration=1)
                print(f"✅ 麦克风设置完成")
        except Exception as e:
            print(f"⚠️ 麦克风设置失败: {e}")
    
    def recognize_speech(self):
        """单次语音识别"""
        try:
            print("\n🎤 请说话... (等待中)")
            
            with self.microphone as source:
                # 监听音频
                audio = self.recognizer.listen(source, timeout=2, phrase_time_limit=5)
            
            print("🔄 正在识别语音...")
            
            # 模拟识别过程
            text = self._simulate_recognition(audio)
            
            if text:
                self.recognition_count += 1
                self.success_count += 1
                return text
            else:
                return None
                
        except sr.WaitTimeoutError:
            print("⏰ 等待超时，未检测到语音")
            return None
        except Exception as e:
            print(f"❌ 识别过程出错: {e}")
            return None
    
    def _simulate_recognition(self, audio):
        """模拟语音识别（用于演示）"""
        try:
            # 分析音频数据
            audio_data = audio.get_raw_data()
            
            # 计算音频长度
            duration = len(audio_data) / (audio.sample_rate * audio.sample_width)
            
            print(f"🔍 音频分析: 时长={duration:.1f}秒")
            
            # 根据音频时长模拟不同的识别结果
            if duration > 3:
                return "你好智能学习桌助手"
            elif duration > 2:
                return "开始学习"
            elif duration > 1:
                return "你好"
            elif duration > 0.5:
                return "时间"
            else:
                return "嗯"
                
        except Exception as e:
            print(f"⚠️ 模拟识别出错: {e}")
            return None
    
    def continuous_demo(self):
        """连续语音识别演示"""
        print("\n🎙️ 开始连续语音识别演示")
        print("💡 说话时系统会自动识别并显示文字")
        print("💡 输入 'q' 并按回车退出")
        print("="*50)
        
        self.is_running = True
        
        # 启动语音识别线程
        recognition_thread = threading.Thread(target=self._recognition_loop, daemon=True)
        recognition_thread.start()
        
        # 等待用户输入退出命令
        while self.is_running:
            try:
                user_input = input()
                if user_input.lower() == 'q':
                    self.is_running = False
                    print("🛑 退出语音识别演示")
                    break
            except KeyboardInterrupt:
                self.is_running = False
                print("\n🛑 用户中断演示")
                break
        
        # 显示统计信息
        self._show_statistics()
    
    def _recognition_loop(self):
        """语音识别循环"""
        while self.is_running:
            try:
                result = self.recognize_speech()
                
                if result:
                    timestamp = datetime.now().strftime("%H:%M:%S")
                    print(f"[{timestamp}] 🗣️ 识别结果: {result}")
                    
                    # 简单的命令响应
                    self._process_command(result)
                
                time.sleep(0.5)  # 短暂休息
                
            except Exception as e:
                print(f"❌ 识别循环出错: {e}")
                time.sleep(1)
    
    def _process_command(self, text):
        """处理语音命令"""
        if "你好" in text:
            print("   🤖 你好！我是智能学习桌助手")
        elif "时间" in text:
            current_time = datetime.now().strftime("%H:%M:%S")
            print(f"   🕐 当前时间: {current_time}")
        elif "学习" in text:
            print("   📚 开始学习模式，祝您学习愉快！")
        elif "帮助" in text:
            print("   💡 可用命令: 你好、时间、开始学习")
    
    def _show_statistics(self):
        """显示统计信息"""
        success_rate = (self.success_count / self.recognition_count * 100) if self.recognition_count > 0 else 0
        
        print("\n📊 识别统计:")
        print(f"   总识别次数: {self.recognition_count}")
        print(f"   成功次数: {self.success_count}")
        print(f"   成功率: {success_rate:.1f}%")
    
    def single_demo(self):
        """单次语音识别演示"""
        print("\n🎤 单次语音识别演示")
        print("💡 请说话，系统会识别并显示文字")
        print("="*40)
        
        result = self.recognize_speech()
        
        if result:
            print(f"✅ 识别成功: {result}")
            self._process_command(result)
        else:
            print("❌ 识别失败或无语音输入")
    
    def test_microphone(self):
        """测试麦克风功能"""
        print("\n🔍 测试麦克风功能")
        print("="*40)
        
        try:
            # 显示可用麦克风
            print("🎤 可用麦克风设备:")
            microphones = sr.Microphone.list_microphone_names()
            
            if not microphones:
                print("❌ 未检测到麦克风设备")
                return False
            
            for i, mic_name in enumerate(microphones[:5]):  # 只显示前5个
                print(f"   {i}: {mic_name}")
            
            if len(microphones) > 5:
                print(f"   ... 还有{len(microphones) - 5}个设备")
            
            # 测试录音
            print("\n🔊 测试录音功能 (请说话3秒)...")
            with self.microphone as source:
                audio = self.recognizer.listen(source, timeout=3, phrase_time_limit=3)
                print("✅ 录音测试成功")
            
            return True
            
        except Exception as e:
            print(f"❌ 麦克风测试失败: {e}")
            return False

def main():
    """主函数"""
    print("🎯 AIOT智能学习桌 - 简单语音识别演示")
    print("="*60)
    print("📝 功能：将您的语音转换为文字")
    print("🔧 技术：基于SpeechRecognition库")
    print("💻 环境：笔记本电脑代替开发板")
    print("="*60)
    
    # 创建演示对象
    demo = SimpleVoiceDemo()
    
    while True:
        print("\n📋 请选择演示模式:")
        print("1. 🎤 单次语音识别")
        print("2. 🎙️ 连续语音识别")
        print("3. 🔧 测试麦克风")
        print("4. 📊 使用说明")
        print("5. 🚪 退出程序")
        
        choice = input("\n请输入选择 (1-5): ").strip()
        
        if choice == '1':
            demo.single_demo()
        
        elif choice == '2':
            demo.continuous_demo()
        
        elif choice == '3':
            demo.test_microphone()
        
        elif choice == '4':
            print("\n📚 使用说明:")
            print("="*40)
            print("🎤 单次识别: 说一句话，系统识别并显示")
            print("🎙️ 连续识别: 持续监听，实时识别语音")
            print("🔧 测试麦克风: 检查麦克风设备状态")
            print("💡 支持命令: 你好、时间、开始学习、帮助")
            print("🛑 退出方式: 连续模式下输入 'q' 退出")
        
        elif choice == '5':
            print("\n👋 感谢使用AIOT智能学习桌语音识别演示！")
            print("🎓 这展示了语音转文字的基本功能")
            print("🚀 在实际项目中可以集成更多智能功能")
            break
        
        else:
            print("❌ 无效选择，请重新输入")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n🛑 程序被用户中断")
        print("👋 感谢使用！")
    except Exception as e:
        print(f"\n❌ 程序运行出错: {e}")
        print("💡 请检查系统环境和麦克风设备") 